package org.nokatag.timer;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;

import org.nokatag.system.Concest;
import org.nokatag.system.NLoadFun;
import org.nokatag.system.NokaContext;
import org.nokatag.system.ServletNokaContext;



public class NTimerTask extends TimerTask{
	private NTimerItem nTimerItem=null;
	public NTimerTask(NTimerItem nTimerItem){
		this.nTimerItem=nTimerItem;
	}
	@Override
	public void run() {
		if(nTimerItem!=null){
			switch(nTimerItem.getDoType()){
			case NTimer.TIMER_MONTH_OF_TIME://每月,01,08:23:32 表示星期一 的08:23:32 
				dofun(nTimerItem);
				nTimerItem.getNtimer().cancel();
				Timer timer=new Timer(true); //建立定时器
				Date date = NTimer.MonthToDate(nTimerItem.getStart(),nTimerItem.getTimerPrave());
				nTimerItem.setStart(NTimer.AddDate(nTimerItem.getStart(),Calendar.MONTH,1));//月号加一
				timer.schedule(new NTimerTask(nTimerItem), date,NTimer.TIMER_DAY*28);//每月最短28天
				nTimerItem.setNtimer(timer);//更新定时器
				break;
			case NTimer.TIMER_YEAR_OF_TIME://每年
				dofun(nTimerItem);
				if(nTimerItem.getTimerPrave()!=null && nTimerItem.getTimerPrave().indexOf(",")!=-1){
					nTimerItem.getNtimer().cancel();
					Timer timer2=new Timer(true); //建立定时器
					Date date2 = NTimer.YearToDate(nTimerItem.getStart(),nTimerItem.getTimerPrave());
					nTimerItem.setStart(NTimer.AddDate(nTimerItem.getStart(),Calendar.YEAR,1));//年号加一
					timer2.schedule(new NTimerTask(nTimerItem),date2,NTimer.TIMER_DAY*28);//每月最短28天
					nTimerItem.setNtimer(timer2);//更新定时器
				}
				break;
			case NTimer.TIMER_MONTH_MAXDAY_OF_TIME://每月最后一天,08:23:32 表示星期一 的08:23:32 
				dofun(nTimerItem);
				if(nTimerItem.getTimerPrave()!=null && nTimerItem.getTimerPrave().indexOf(",")!=-1){
					nTimerItem.getNtimer().cancel();
					Timer timer2=new Timer(true); //建立定时器
					Date date2 = NTimer.MonthMaxDay(nTimerItem.getStart(),nTimerItem.getTimerPrave());
					nTimerItem.setStart(NTimer.AddDate(nTimerItem.getStart(),Calendar.MONTH,1));//月号加一
					timer2.schedule(new NTimerTask(nTimerItem),date2,NTimer.TIMER_DAY*28);//每月最短28天
					nTimerItem.setNtimer(timer2);//更新定时器
				}
				break;
			default:
				dofun(nTimerItem);
				break;
			}
		}
	}
	
	//================================================================
	@SuppressWarnings("rawtypes")
	private void dofun(NTimerItem nTimerItem){
		String classurl=nTimerItem.getClassUrl();// org.noka.Test.getValue
		if(classurl!=null && classurl.indexOf(".")!=-1){
			String classpath=classurl.substring(0,classurl.lastIndexOf("."));//path = com.sn.Scel  类
			String fun = classurl.substring(classurl.lastIndexOf(".")+1,classurl.length());// fun = F 方法
			//-----------------初始化参数----------------------------------
			NokaContext nContext = new NokaContext(new HashMap<String,Object>());
			NokaContext.setContext(nContext);
			if(null!=Concest.DB_MANAGER){
				Connection noka_db_con = Concest.DB_MANAGER.getConnection();
				nContext.put(ServletNokaContext.REQUEST_CONNECTION, noka_db_con);
			}
			//------------------------------------------------------------
			try{
				//--------------加载类-------------------------------
				NLoadFun nloadFun = new NLoadFun();
				Object obj = nloadFun.getBean(classpath);
				//-------------调用方法-----------------------------
				Method method =null;
				if(nTimerItem.getClassPrave()==null || nTimerItem.getClassPrave().isEmpty()){//没有参数
					method = obj.getClass().getMethod(fun.trim());
					method.invoke(obj);
				}else{//有参数
					//---------------参数类型----------------------------
					Class[] argsClass = new Class[ nTimerItem.getClassPrave().size()];
					for (int a = 0;a<argsClass.length;a++) {
						argsClass[a]=nTimerItem.getClassPrave().get(a).getClass();
					}
					//---------------参数值------------------------------
					Object arglist[] = new Object[nTimerItem.getClassPrave().size()];
					for (int a = 0;a<argsClass.length;a++) {
						arglist[a]=nTimerItem.getClassPrave().get(a);
					}
					//---------------调用方法---------------------------
					method = obj.getClass().getMethod(fun.trim(), argsClass);
					method.invoke(obj, arglist);
				}
			}catch(Exception se){
				se.printStackTrace();
			}finally{
				if(null!=Concest.DB_MANAGER){
					try{Concest.DB_MANAGER.closeConnection(ServletNokaContext.getConnection());}catch(Exception se){}
				}
			}
		}
	}

}
